/* eslint-disable @typescript-eslint/no-explicit-any */
export type DataType<T = any> = {
  relation?: string | number;
  children?: (DataType<T> | Partial<T>)[];
  [x: string]: any;
}; // | { [key: string]: any }

export type SecondArgType<T> = T extends (
  arg1: any,
  arg2: infer B,
  ...args: any[]
) => any
  ? B
  : never;

export interface FieldType {
  /** 当前节点的name path */
  name: number;
  key: string;
}

export interface FieldNames {
  /** 规则组关系映射字段 */
  relation?: string;
  /** 规则项列表映射字段 */
  children?: string;
}

export type PathSegment = string | number;

export type NamePath = PathSegment[];

export interface FormOperation<T> {
  /** 获取当前行数据 */
  getCurrentRowData: () => Partial<T>;
  /** 设置当前行数据 */
  setCurrentRowData: (value: Partial<T>) => void;
  /** 获取当前的节点的值, { relation: ..., children: ... } */
  getGroupData: () => DataType<T>;
}

export interface CreateOperation<T> {
  /** 添加一个规则项 */
  add: (defaultValue?: Partial<T>) => void;
  /** 添加一个规则组 */
  addGroup: (defaultGroupData?: DataType<T>) => void;
  /** 获取当前的节点的值, { relation: ..., children: ... } */
  getGroupData: () => DataType<T>;
}

export interface NodeFieldType {
  /** 层级路径 */
  levelPath: number[];
  /** 数量 */
  count: number;
  /** 当前深度 */
  deepth: number;
  /** 当前项在当前层级的索引 */
  index: number;
}

export interface CreateFieldType extends NodeFieldType {
  /** 是否超过最大数量 */
  overMaxCount?: boolean;
  /** 是否超过最大深度 */
  overMaxDeepth?: boolean;
  /** 是否不可编辑 */
  disabled?: boolean;
}

export type ChildrenItemFunction<T> = (
  meta: FieldType,
  index: number,
  action: FormOperation<T>
) => React.ReactNode;

export interface Operation<T> {
  /** 在当前层级末尾添加一条数据 */
  add: (defaultValue?: Partial<T>, insertIndex?: number) => void;
  /** 在当前层级末尾添加一个规则组 */
  addGroup: (defaultGroupData?: DataType<T>, insertIndex?: number) => void;
  /** 删除某项，如果index不写，删除当前项 */
  remove: (index?: number) => void;
  /** 移动当前项到指定位置 */
  move: (to: {
    /** 层级路径，不写默认当前层级 */
    levelPath?: number[];
    /** 插入对应层级的位置 */
    index: number;
  }) => void;
  /** 获取当前层级数据 */
  get: () => T[];
  /** 获取当前的节点的值, { relation: ..., children: ... } */
  getGroupData: () => DataType<T>;
}

/** 不常用的属性收敛在这个字段里 */
export interface ExtraContextType {
  /** 当前项的层级索引 */
  levelPath: number[];
  /** 是否是叶子节点 */
  isLeaf: boolean;
  /** 当前项在当前层级的索引 */
  index: number;
  /** 是否禁用 */
  disabled?: boolean;
  /** 是否超过最大数量 */
  overMaxCount?: boolean;
}

export interface ActionRefType<T> {
  /** 添加一个规则组 */
  addGroup: (
    levelPath: number[],
    defaultGroupData?: DataType<T>,
    insertIndex?: number
  ) => void;
  /** 添加一条数据 */
  add: (
    levelPath: number[],
    defaultValue?: Partial<T>,
    insertIndex?: number
  ) => void;
  /** 删除某项 */
  remove: (levelPath: number[], removeIndex: number) => void;
  /** 获取当前层级数据 */
  get: (levelPath: number[]) => unknown[] | undefined;
  /** 获取当前的节点的值, { relation: ..., children: ... } */
  getGroupData: (levelPath: number[]) => DataType<T>;
  /** 移动选择的项到指定位置 */
  move: (
    from: {
      /** 层级路径，不写默认当前层级 */
      levelPath?: number[];
      /** 插入对应层级的位置 */
      index: number;
    },
    to: {
      /** 层级路径，不写默认当前层级 */
      levelPath?: number[];
      /** 插入对应层级的位置 */
      index: number;
    }
  ) => void;
}
